/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ni;

import protocol.*;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;


/**
 *
 * @author CarlaSauvanaud
 */
public class UDPSend {
    
    static DatagramSocket socket = null;
    //Avant un envoi, il faut penser à vérifier que l'utilisateur destinateur est
    //bien connecté grace à la fonction isConnected de la classe ChatModele
    
    public static void envoiMessageUnicast(Message m, InetAddress ad) {

        //On convertit le message a envoyer en un tableau d'octets
        byte[] tab = null;
        
        try {
            //conversion du Message à envoyer en un tableau d'octets
            tab = ChatNI.serialiser(m);
        } catch (Exception ex) {
            System.out.println(ex.getMessage() + " (serialiser)");
        }

        //Creation du datagramme à envoyer vers le port de reception UDP
        //L'adresse source est l'adresse locale de l'utilisateur.
        DatagramPacket dg;       
        dg = new DatagramPacket(tab, tab.length, ad, Port.receptionUDP);
       
        //Creation du socket UDP et envoie du datagramme sur le réseau
        try {
            //Si le socket est deja cree on ne le re-cree pas
            if (socket == null) {
                socket = new DatagramSocket(Port.emissionUDP);
            }
        } catch (SocketException ex) {
            System.out.println(ex.getMessage() + " (new datagram)");
        }

        System.out.println("Valeur socket: " + socket.toString());
        
        
        try {          
            //Envoi du paquet
            socket.send(dg);
        } catch (IOException ex) {
            System.out.println(ex.getMessage() + " (send)");
        }

    }

    public static void envoiMessageBroadcast(Message m) {

        //Creation du socket UDP et envoie du datagramme sur le réseau
        //On convertit le message a envoyer en un tableau d'octets
        byte[] tab = null;

        try {
            tab = ChatNI.serialiser(m);
        } catch (Exception ex) {
            System.out.println(ex.getMessage() + " (serialiser broadcast)");
        }

        //Creation du datagramme à envoyer vers le port destination de UDP
        DatagramPacket dg;
        try {
            dg = new DatagramPacket(tab, tab.length, InetAddress.getByName("255.255.255.255"), Port.receptionUDP);

            try {
                //Si le socket est deja cree on ne le re-cree pas
                if (socket == null) {
                    socket = new DatagramSocket(Port.emissionUDP);
                }

            } catch (SocketException ex) {
                System.out.println(ex.getMessage() + " (new datagram broadcast)");
            }
            try {
                //L'envoie !!!
                socket.send(dg);
            } catch (IOException ex) {
                System.out.println(ex.getMessage() + " (send broadcast)");
            }
        } catch (UnknownHostException ex) {
            System.out.println(ex.getMessage() + "unknown");
        }
    }
}